package com.demo.java.OD301_350.OD335;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【找出两个整数数组中同时出现的整数(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146153983
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取两个数组输入
        String[] numbers1Str = scanner.nextLine().split(",");
        String[] numbers2Str = scanner.nextLine().split(",");

        // 将字符串数组转换为整数数组
        int[] numbers1 = new int[numbers1Str.length];
        int[] numbers2 = new int[numbers2Str.length];

        for (int i = 0; i < numbers1Str.length; i++) {
            numbers1[i] = Integer.parseInt(numbers1Str[i]);
        }

        for (int i = 0; i < numbers2Str.length; i++) {
            numbers2[i] = Integer.parseInt(numbers2Str[i]);
        }

        // 调用方法得到结果并输出
        List<String> result = solveMethod(numbers1, numbers2);
        for (String line : result) {
            System.out.println(line);
        }

        scanner.close();
    }

    public static List<String> solveMethod(int[] numbers1, int[] numbers2) {
        // 用Map统计数字出现的次数
        Map<Integer, Integer> count1 = new HashMap<>();
        Map<Integer, Integer> count2 = new HashMap<>();

        // 统计数组1中每个数字的出现次数
        for (int number : numbers1) {
            count1.put(number, count1.getOrDefault(number, 0) + 1);
        }

        // 统计数组2中每个数字的出现次数
        for (int number : numbers2) {
            count2.put(number, count2.getOrDefault(number, 0) + 1);
        }

        // 用Map存储共同数字的最小出现次数
        Map<Integer, List<Integer>> sameNumberMap = new HashMap<>();
        boolean isFlagged = true;

        // 遍历第一个数组的数字，找到同时出现在第二个数组的数字
        for (Map.Entry<Integer, Integer> entry : count1.entrySet()) {
            int number = entry.getKey();
            int count = entry.getValue();

            if (count2.containsKey(number)) {
                isFlagged = false;
                // 获取两个数组中该数字的最小出现次数
                int sameNumberCount = Math.min(count, count2.get(number));
                sameNumberMap.computeIfAbsent(sameNumberCount, k -> new ArrayList<>()).add(number);
            }
        }

        // 存储最终的输出结果
        List<String> output = new ArrayList<>();

        // 如果没有共同数字，输出 NULL
        if (isFlagged) {
            output.add("NULL");
        } else {
            // 对出现的次数进行排序
            List<Integer> result = new ArrayList<>(sameNumberMap.keySet());
            Collections.sort(result);

            // 对每个次数中的数字进行排序
            for (int count : result) {
                List<Integer> numbers = sameNumberMap.get(count);
                Collections.sort(numbers);
                // 将结果拼接成字符串并添加到输出列表中
                String nums = String.join(",", numbers.stream().map(String::valueOf).toArray(String[]::new));
                output.add(count + ":" + nums);
            }
        }

        return output;
    }
}